import { finishAssignment, getAssignmentAndCemetaryById } from "$lib/server/assignments"; import type { PageServerLoad, Actions } from "./$types"; import { error, redirect } from "@sveltejs/kit"; export const load = (async ({ params, url, locals }) => { if (!locals.user) { redirect(303, `/login?redirectTo=${encodeURIComponent(url.toString())}`); } const { assignment, cemetaryPlot } = await getAssignmentAndCemetaryById( locals.dbConn, +params.assignmentId, ); if (!assignment) { return error(404, `Cemetary plot with id ${params.assignmentId} not found`); } console.debug("Found assignment: ", assignment); if (assignment.gardenerId !== locals.user.id) { return error(403, "This assignment isn't for you!"); } return { user: locals.user, assignment, cemetaryPlot, }; }) satisfies PageServerLoad; export const actions = { // FIXME: Skipped input validation. // FIXME: Is 'load' action run (wrt. authentication)? finish: async ({ params, request, locals }) => { const formData = await request.formData(); const imageFiles = formData.getAll("images") as File[]; const note = (formData.get("note") as string | null) ?? undefined; // Read image files in parallel. const images = await Promise.all( imageFiles.map(async (f) => ({ name: f.name, bytes: new Uint8Array(await f.arrayBuffer()), })), ); await finishAssignment(locals.dbConn, locals.s3Client, { images, note, assignmentId: +params.assignmentId, // We have parsing at home... }); return { success: true }; }, } satisfies Actions;